#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
using namespace std;

//template<typename T>
//T Add(const T& x, const T& y)
//{
//	return x + y;
//}
//
//int main()
//{
//	int a = 1, b = 2;
//	double c = 1.1, d = 2.2;
//
//	Add(a, b);
//	Add(c, d);
//
//	Add((double)a, d);
//	Add(a, (int)d);
//	Add<int>(a, d);
//
//	return 0;
//}

//int Add(const int& x, const int& y)
//{
//	cout << "Add(const int& x, const int& y)" << endl;
//	return x + y;
//}

//template<typename T1, typename T2>
//T1 Add(const T1& x, const T2& y)
//{
//	cout << "Add(const T1& x, const T2& y)" << endl;
//	return x + y;
//}
//
//int main()
//{
//	Add(1, 2);
//	Add(3, 4.4);
//	return 0;
//}

template<typename T>
class Stack
{
public:
	Stack(int InitSize = 4);

	~Stack();
private:
	T* _a;
	int _size;
	int _capacity;
};

template<typename T>
Stack<T>::Stack(int InitSize)
{
	_a = new T[InitSize];
	_size = 0;
	_capacity = InitSize;
}

template<typename T>
Stack<T>::~Stack()
{
	if (_a != nullptr)
	{
		delete[] _a;
		_size = _capacity = 0;
	}
}

int main()
{
	Stack<int> st1(5);
	Stack<double> st2(10);

	return 0;
}


//void SwapInt(int& x, int& y)
//{
//	int tmp = x;
//	x = y;
//	y = tmp;
//}
//
//void SwapDouble(double& x, double& y)
//{
//	double tmp = x;
//	x = y;
//	y = tmp;
//}

template<typename T>
void Swap(T& x, T& y)
{
	T tmp = x;
	x = y;
	y = tmp;
}

template<typename T>
T* Array(int n)
{
	T* arr = new T[n];
	return arr;
}

//int main()
//{
//	int a = 1, b = 2;
//	double c = 3.3, d = 4.4;
//	Swap(a, b);
//	Swap(c, d);
//
//	Array<char>(10);
//	return 0;
//}